package com.example;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 简单的 YAML 配置读取工具类
 */
public class YamlConfigReader {
    private static Map<String, Object> configMap;

    // 静态初始化：加载 application.yml
     static {
        try {
            // 1. 优先读取 JAR 包同级目录的 application.yml（外部配置）
            String externalConfigPath = System.getProperty("user.dir") + File.separator + "application.yml";
            File externalConfigFile = new File(externalConfigPath);

            InputStream inputStream;
            if (externalConfigFile.exists() && externalConfigFile.isFile()) {
                System.out.println("加载外部配置文件：" + externalConfigPath);
                inputStream = new FileInputStream(externalConfigFile);
            } else {
                // 2. 外部配置不存在，读取 JAR 内部的默认配置（src/main/resources下）
                System.out.println("外部配置文件不存在，加载内部默认配置");
                inputStream = YamlConfigReader.class.getClassLoader().getResourceAsStream("application.yml");
            }

            // 解析配置
            if (inputStream != null) {
                Yaml yaml = new Yaml();
                configMap = yaml.load(inputStream);
                inputStream.close();
            } else {
                System.err.println("未找到任何配置文件！");
                configMap = new HashMap<>();
            }
        } catch (Exception e) {
            System.err.println("加载配置文件失败：" + e.getMessage());
            configMap = new HashMap<>();
        }
    }

    /**
     * 获取配置值（支持多级键，如 "smtp.host"）
     * @param key 配置键（如 "smtp.host"）
     * @param defaultValue 默认值
     * @return 配置值或默认值
     */
    public static String getValue(String key, String defaultValue) {
        if (configMap == null || configMap.isEmpty()) {
            return defaultValue;
        }

        String[] keyParts = key.split("\\.");
        Map<String, Object> currentMap = configMap;

        for (int i = 0; i < keyParts.length; i++) {
            String part = keyParts[i];
            if (currentMap.containsKey(part)) {
                if (i == keyParts.length - 1) {
                    // 最后一级键，返回值
                    Object value = currentMap.get(part);
                    return value != null ? value.toString() : defaultValue;
                } else if (currentMap.get(part) instanceof Map) {
                    // 不是最后一级，继续深入
                    currentMap = (Map<String, Object>) currentMap.get(part);
                } else {
                    // 中间级不是Map，说明键不存在
                    return defaultValue;
                }
            } else {
                // 键不存在
                return defaultValue;
            }
        }
        return defaultValue;
    }
}